`
https://leetcode.cn/problems/maximum-fruits-harvested-after-at-most-k-steps/
`

/**
 * @param {number[][]} fruits
 * @param {number} startPos
 * @param {number} k
 * @return {number}
 */
var maxTotalFruits = function (fruits, startPos, k) {
  const n = fruits.length
  // 向左最远能到 fruits[left][0]
  let left = _.sortedIndexBy(fruits, [startPos - k], ([p]) => p)
  // <= startPos 的最大下标 + 1
  let right = _.sortedIndexBy(fruits, [startPos + 1], ([p]) => p)
  // 从 fruits[left][0] 到 startPos 的水果数
  let s = fruits.slice(left, right).reduce((acc, cur) => acc + cur[1], 0)
  let res = s

  // 滑到能走到的最右
  while (right < n && fruits[right][0] <= startPos + k) {
    s += fruits[right][1]
    // 先向右再向左，步数为 (fruits[right][0] − startPos) + (fruits[right][0] − fruits[left][0])
    // 先向左再向右，步数为 (startPos − fruits[left][0]) + (fruits[right][0] − fruits[left][0])
    // 如果上面两式都大于 k ，就说明 fruits[left][0] 太远了无法到达，需要缩小窗口
    while (
      fruits[right][0] * 2 - fruits[left][0] - startPos > k
      && fruits[right][0] - fruits[left][0] * 2 + startPos > k
    ) {
      s -= fruits[left][1]
      left++
    }
    res = Math.max(res, s)
    // 继续找下一个位置
    right++
  }

  return res
};